package com.mf.controller.threadPool;

import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author: lmf
 * @Create: 2025/5/28 21:56
 * @module 缓存的线程池
 * @Description: 当第一次提交任务到线程池时，会直接构建一个工作线程
 * 这个工作线程带执行完人后，60秒没有任务可以执行后，会结束
 * 如果在等待60秒期间有任务进来，他会再次拿到这个任务去执行
 * 如果后续提升任务时，没有线程是空闲的，那么就构建工作线程去执行。
 * 最大的一个特点，**任务只要提交到当前的newCachedThreadPool中，就必然有工作线程可以处理**
 */
@RestController
@RequestMapping("/newCachedThreadPool")
public class newCachedThreadPool {
    @RequestMapping("/test")
    @Operation(summary = "线程没有等待- 如果线程处理完了任务会在处理其他任务")
    public void test() {
        final ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 1; i < 200; i++) {
            final int j = i;
            executorService.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "正在执行" + j);
            });
        }
        executorService.shutdown();
    }

    @RequestMapping("/test2")
    @Operation(summary = "线程有等待-任务来了会直接创建线程进行处理")
    public void test2() {
        final ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 1; i < 200; i++) {
            final int j = i;
            executorService.execute(() -> {
                try {
                    System.out.println("线程 " + Thread.currentThread().getName() + " 开始执行任务 " + j);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + "正在执行" + j);
            });
        }
        executorService.shutdown();
    }
}
